void Thinning (ImSize, DeltaDir, GradMag, GradAng, ThinMag, ThinAng)
int  ImSize, DeltaDir;
BYTE ** GradMag;
BYTE ** GradAng;
BYTE ** ThinMag;
BYTE ** ThinAng;
{
   int  r,c, N1,N2, N1c,N1r, N2c,N2r, N1m,N2m, N1ok,N2ok;
   int  C, Cm, Cmax,Cmin;

   for (r=0; r<ImSize; r++) {
      for (c=0; c<ImSize; c++) {
         ThinMag [r][c] = 0;
         ThinAng [r][c] = 0;
   }  }
   for (r=1; r<ImSize-1; r++) {
      for (c=1; c<ImSize-1; c++)  if (GradMag[r][c]) {
         C = (int) GradAng [r][c];
         if (0<=C && C<=15 || 240<=C && C<=255 || 112<=C && C<=143) {
            N1r = r-1;  N1c = c;
            N2r = r+1;  N2c = c;     /* west, east */

         }else if (16<=C && C<=47 || 144<=C && C<=175) {
            N1r = r-1;  N1c = c-1;
            N2r = r+1;  N2c = c+1;   /* north-east, south-west */

         }else if (48<=C && C<=79 || 176<=C && C<=207) {
            N1r = r;    N1c = c-1;
            N2r = r;    N2c = c+1;   /* north, south */

         }else if (80<=C && C<=111 || 208<=C && C<=239) {
            N1r = r-1;  N1c = c+1;
            N2r = r+1;  N2c = c-1;   /* north-west, south-east */
         }
         Cmin = C - DeltaDir;
         Cmax = C + DeltaDir;
         N1 = GradAng [N1r][N1c];
         N2 = GradAng [N2r][N2c];
         if (Cmin>=0 && Cmax<=255) {
            N1ok = (Cmin<=N1 && N1<=Cmax);
            N2ok = (Cmin<=N2 && N2<=Cmax);
         }else{
            C += 128;  C &= 255;
            Cmin = C - DeltaDir;
            Cmax = C + DeltaDir;
            N1 += 128;  N1 &= 255;  N1ok = (Cmin<=N1 && N1<=Cmax);
            N2 += 128;  N2 &= 255;  N2ok = (Cmin<=N2 && N2<=Cmax);
         }
         if (N1ok && N2ok) {
            N1m = GradMag [N1r][N1c];
            N2m = GradMag [N2r][N2c];
            Cm  = GradMag [r][c];
            if (N1m<=Cm && N2m<=Cm) {
               ThinMag [r][c] = GradMag [r][c];
               ThinAng [r][c] = GradAng [r][c];
}  }  }  }  }
